import VueRouter from 'vue-router'
import Vue from 'vue'

import LoginHome from '../components/login/LoginHome.vue'
import HomePage from '../components/HomePage.vue'
import axios from 'axios'
import {deserializeBinary} from '../protobuf/ProtoJSFileImport.js'

import ChatWindow from '../components/chat/ChatWindow.vue'
import FrienndList from '../components/friend_list/FriendList.vue'
import GroupList from '../components/friend_list/GroupList.vue'


Vue.use(VueRouter)

const router =new VueRouter({ 
        routes:[
            {
                // 登录页
                name:'login',
                path:'/login',
                component:LoginHome
                
            },
            {
                // 主页
                name:'homePage',
                path:'/',
                component:HomePage,
                children:[
                    {
                        // 聊天页面
                        name:'chat',
                        path:'chat',
                        component: ChatWindow
                    },
                    {
                        // 好友列表
                        name:'frienndList',
                        path:'frienndList',
                        component: FrienndList
                    },
                    {
                        // 群列表
                        name:'groupList',
                        path:'groupList',
                        component: GroupList
                    }
                ]
                
            }

        ]
})

router.beforeEach((to,from,next)=>{


    /**
     * 自动登录模块
     * 
     * 这里的自动登录逻辑是这样的：
     * 在手动登录时会在localStorage中保存一个布尔值表示是否自动登录
     * 并且同时保存一个session用来验证本次会话处于已登录状态
     * 这样的话当关闭浏览器时session被删除,下次访问登录页面时session不存在
     * 然后就开始验证token,验证通过则查看是否自动登录,如果是则重新保存session并跳转对应页面
     * 如果不自动登录则跳转登录页面手动登录,登录成功后也会在那个页面逻辑中保存session
     * 如果直接访问其他页面则会在验证token后检查是否有已登录session和是否自动登录,并根据结果跳转
    */ 
    {
    let token=localStorage.getItem('token')
    // 注意，这里获取到的全都是string类型，所以要转换为布尔值方便操作
    let automaticLogin=localStorage.getItem('automaticLogin') == 'true'
    let sessionAutomaticLogin=sessionStorage.getItem('sessionAutomaticLogin') == 'true'
    if(token==null || token=='' || token==undefined){
        // 没有token,就需要手动登录
        // 如果不是去login页则跳转login页,如果是就放行
        next(to.name === 'login'?undefined: '/login')
    }else{
            // 验证token
        axios.get('/accountNumbers/verifyToken',{
            headers:{
                "Content-Type":"application/x-protobuf",
                "Authorization":token
            },
            responseType:'arraybuffer'
        }).then(res=>{
            const proto =deserializeBinary(new Uint8Array(res.data));
            const lastData=proto.toObject();
            if(lastData.code==200){
                    // 如果既没有登录过也没有自动登录，则清空token(必须清空,否则上面的判断不放行会死循环的)去登录页面
                    if(sessionAutomaticLogin==true || automaticLogin==true){
                        // 如果设置了自动登录则在跳转前给上登录session
                        sessionStorage.setItem('sessionAutomaticLogin',true)
                        // 根据路径跳转主页或想去的页面
                        if(to.name == 'homePage'){ // 对homePage做了处理，这个页面不要进入，是用来做结构的
                            next('chat')
                        }
                        next(to.name == 'login'?'chat':undefined)
                    }else{
                        // 既没有登录也没有自动登录就清空token去登录
                        localStorage.removeItem('token')
                        next('/login')
                    }    
            }else{
                // token验证失败，清空token去登录
                localStorage.removeItem('token')
                next('/login')
            }
        }).catch((err)=>{
            console.log(err)
            // 报异常了，清空token去登录
            localStorage.removeItem('token')
            next('/login')
        })

    }
    }

})

// 后置路由守卫
// router.afterEach(to=>{

// })

export default router
